/**
 * learn-seajs
 *
 * 入口：
 *
 * date: 2020-10-2
 * ----------------
 *
 */

// define(function (require, exports, module) {
//   // 同步操作
//   const test = require('module/Test')
//   console.log(test)
//   console.log('通过 11')
//   console.log('通过 22')
// })

// 有时候，在浏览器需要一个文件，需要去服务器加载，
// 其他代码正常运行，带文件加载成功后，再去使用，
// 这个过程叫做异步过程

// seajs 为了实现异步操作，提供了异步加载 模块的方法
// require.async()， 这个方法和 seajs.use() 一样
// 第一个参数，是模块集合，(如果是单个模块，可以是字符串)
// 第二个参数，是回调函数

define(function (require) {
  // 异步操作
  console.log('11111111111')
  require.async('module/Test', function(a) {
    console.log('2222222 a', a)
  })
  console.log('3333333')
})

define(function (require) {
  // 异步操作
  require.async(['module/Test', 'module/Color'], function(test, color) {
    console.log('test', test)
    console.log('color', color)
  })
})


// 1、在条件if语句中， require 同步/异步 对比
define(function (require, exports, module) {
  // 同步
  // require方法: 条件成立的语句中，立即加载并执行模块文件
  //                 不成立，立即加载模块，但不执行

  // if (true) {
  //   const test = require('module/Test')
  //   console.log(test)
  // } else {
  //   const color = require('module/Color')
  //   console.log(color) //会被加载
  // }

  // 异步: 条件成立的语句中，立即加载并执行模块文件
  //          不成立，不加载模块，也不执行
  if (true) {
    require.async('module/Test', function (test) {
      console.log(test)
    })
  } else {
    require.async('module/Color', function (color) {
      console.log(color) // 不会被加载
    })
  }
})


// 2、在异步语句中， 同步/异步的对比
define(function (require) {
  // 立即加载模块，在异步语句执行后，再去执行
  setTimeout(() => {
    const test = require('module/Test')
    console.log(test)
  }, 3000);

  // 在异步语句执行后，再加载模块，并执行
  setTimeout(() => {
    require.async('module/Color', function (color) {
      console.log(color)
    })
  }, 3000);

  console.log('11111111111')
})
